//
// Created by liwan on 11/3/22.
//

#ifndef WEBSERVICE_WEBSERVICE_EPOLL_H
#define WEBSERVICE_WEBSERVICE_EPOLL_H

#include <fcntl.h>
#include <cstring>
#include <signal.h>
#include <dirent.h>
#include <iostream>
#include <algorithm>
#include <sys/stat.h>
#include <sys/epoll.h>


#include "../include/wrap.h"
#include "../include/pub.h"

#define BUFF_SIZE 1024
#define INFO_BUFF 256
#define PATH  "/web-http"
#define PORT 8000
#define _DIR_PREFIX_FILE_ "dir_header.html"
#define _DIR_TAIL_FILE_ "dir_tail.html"

/**
 * @brief 主函数，创建、监听等等
 */
void Main();

/**
 * @brief 读取客户端发送的信息，并解析
 * @param epfd 节点树
 * @param ev 节点
 */
void ReadClientRequest(int epfd, struct epoll_event *ev);

/**
 * @brief 改变当前目录
 */
void ChangePath(char * file);

/**
 * @brief 发送状态行和消息部首
 * @param cfd socket
 * @param code 状态码
 * @param info 信息
 * @param filetype 文件类型
 * @param length 数据长度
 */
void SendHeader(int cfd, int code, char *info, char *filetype, int length);

/**
 * @brief 发送文件
 * @param cfd 客户端socket
 * @param path 文件路径
 * @param epfd 节点树
 * @param ev 节点
 * @param flag 是否关闭
 */
void SendFile(int cfd, char *path, int epfd, struct epoll_event *ev, int flag);

/**
 * @brief 设置不堵塞
 * @param cfd socket
 */
void SetFL(int cfd);

/**
 * @brief 上树
 * @param epfd  节点树
 * @param ev 节点
 */
void AddEpoll(int epfd, epoll_event *ev);

/**
 * @brief 下树
 * @param epfd  节点树
 * @param ev 节点
 */
void DelEpoll(int epfd, epoll_event *ev);

/**
 * @brief 发送状态行 消息
 * @param epfd  节点树
 * @param ev 节点
 */
void SendResponse(char * strfile, int epfd, epoll_event *ev);

/**
 * @brief 发送文件夹信息
 * @param ev 节点
 * @param strfile 文件夹名字
 */
void SendDir(epoll_event *ev, char *strfile);

#endif //WEBSERVICE_WEBSERVICE_EPOLL_H
